// 定义xlcomm项目整体通用的宏
#ifndef XLCOMM_DEFINE_H_
#define XLCOMM_DEFINE_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 用于导入导出dll接口
#ifdef _WIN32
#ifdef XLCOMM_EXPORT
#define XLCOMM_API __declspec(dllexport)
#else
#define XLCOMM_API __declspec(dllimport)
#endif  // XLCOMM_EXPORT
#else
#define XLCOMM_API
#endif  // _WIN32

// 通用断言（Logger类不可用时用这个）
#define XLCOMM_ASSERT0(expression)                                           \
  {                                                                          \
    if (!(expression)) {                                                     \
      fprintf(stderr, "XLCOMM_ASSERT0(%s) failure! - %s:%d %s() abort!!!\n", \
              #expression, __FILE__, __LINE__, __FUNCTION__);                \
      abort();                                                               \
    }                                                                        \
  }

// 文件描述符类型
#ifdef _WIN32
#include <WinSock2.h>
using XlSockFd = SOCKET;
#else
using XlSockFd = int;
#endif

// 定义一些常用的内联小函数
namespace xlcomm {

// 内存数据置为0
inline void* MemZero(void* p, size_t size) { return memset(p, 0, size); }

// 字符串拷贝最好用这个封装
// 避免三个问题：1.strcpy可能越界、2.如果dest占不下strncpy只拷贝不置0、3.避免size忘记减1
inline char* Strncpy(char* dest, const char* src, size_t size) {
  memset(dest, 0, size);
  return strncpy(dest, src, size - 1);
}

}  // namespace xlcomm

#endif  // XLCOMM_DEFINE_H_